Descripción del proyecto

Objetivo principal:

  • Explorar el desacople de la relación entre el clima y el número de casos reportados de malaria con respecto a las actividades de control realizadas en la región de Loreto, Perú.

Objetivos específicos:

  • Determinar el modelo estadístico que mejor permita explorar la relación entre el clima y el número de casos reportados de malaria en la ventana temporal del estudio.

  • Determinar si el efecto del clima en el número de casos reportados de malaria varia en el tiempo según el modelo.

Carga y validación de datos

Contamos con una tabla de datos con el número de casos reportados de malaria (falciparum y vivax) por mes en cada distrito de la región de Loreto desde de enero de 2000 a diciembre de 2017. Además, para cada uno de estos registros se tiene el valor mensual de variables climáticas consideradas para el estudio.

Las columnas de la tabla acompañadas de su descripción se muestra continuación:

Columna Descripción
district Distrito.
year Año.
month Mes.
falciparum Número de casos de falciparum.
vivax Número de casos de vivax.
aet Evapotranspiración real.
prcp Precipitación
q Escorrentía
soil Humedad del suelo.
tmax Temperatura máxima.
tmin Temperatura mínima
water_deficit Déficit hídrico.
pop2015 Población del distrito en el año 2015.
province Provincia a la que pertenece el distrito.
region Region/Departamento al que pertenece el distrito (Loreto)
id_district ID del distrito.

Carga de los datos

Creación de la columnas

Creamos una columna llamada date con formato de fecha a partir de las columnas year y month. También añadimos una columna llamada control la cual indica las fechas que pertenecen al periodo de octubre de 2005 a setiembre de 2010 en el cual se realizaró el programa de control. Por último, agregamos una columna llamada malaria, la cual contiene el número total de casos registrados (falciparum + vivax) en cada fecha.

Validación de campos

## Número de meses: 216
## Número de distritos: 49

Número de distritos por mes

##  as.character(date)       n     
##  Length:216         Min.   :49  
##  Class :character   1st Qu.:49  
##  Mode  :character   Median :49  
##                     Mean   :49  
##                     3rd Qu.:49  
##                     Max.   :49

Número de meses por distritos

##    district               n      
##  Length:49          Min.   :216  
##  Class :character   1st Qu.:216  
##  Mode  :character   Median :216  
##                     Mean   :216  
##                     3rd Qu.:216  
##                     Max.   :216

Análisis exploratorio de datos

Tablas descriptivas

Casos reportados de malaria por falciparum

Por región

Por provincia

Por distrito

Casos reportados de malaria por vivax

Por región

Por provincia

Por distrito

Casos reportados de malaria (falciparum y vivax)

Por región

Por provincia

Por distrito

Número de casos reportados de malaria en el tiempo

theme_set(theme_light())

dataset %>% 
  dplyr::group_by(date) %>% 
  dplyr::summarise(
    reported_cases = sum(malaria)
  ) %>% 
  ggplot(
    aes(
      x = date, 
      y = reported_cases / 1000
    )
  ) +
  geom_line() +
  scale_x_datetime(
    date_labels = '%Y',
    date_breaks = '1 year'
  ) +
  labs(
    y = 'Número de casos reportados de malaria (x1000)', 
    x = NULL
  ) +
  ggtitle(
    label = 'Número de casos mensuales reportados de malaria (x1000) durante los
    años 2000 a 2017 en Loreto'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

dataset %>% 
  dplyr::group_by(province, date) %>% 
  dplyr::summarise(
    reported_cases = sum(malaria)
  ) %>% 
  ggplot(
    aes(
      x = date, 
      y = reported_cases
    )
  ) +
  geom_line() +
  scale_x_datetime(
    date_labels = '%Y',
    date_breaks = '5 year'
  ) +
  labs(
    y = 'Número de casos reportados de malaria (x1000)', 
    x = NULL
  ) +
  facet_wrap(
    facets = . ~ province,
    scales = 'free'
  ) +
  ggtitle(
    label = 'Número de casos mensuales reportados de malaria (x1000) durante los
    años 2000 a 2017 por provincias en Loreto'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

dataset %>% 
  ggplot(
    aes(
      x = date, 
      y = malaria / 1000
    )
  ) +
  geom_line() +
  scale_x_datetime(
    date_labels = '%Y',
    date_breaks = '5 year'
  ) +
  labs(
    y = 'Número de casos reportados de malaria (x1000)', 
    x = NULL
  ) +
  facet_wrap(
    facets = .~district,
    scales = 'free'
  ) +
  ggtitle(
    label = 'Número de casos mensuales reportados de malaria (x1000) durante los
    años 2000 a 2017 por distritos en Loreto'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Número de casos reportados de malaria por parásito en el tiempo

dataset %>% 
  dplyr::group_by(date) %>% 
  dplyr::summarise(
    falciparum = sum(falciparum),
    vivax = sum(vivax)
  ) %>% 
  tidyr::pivot_longer(
    cols = c(falciparum, vivax),
    names_to = 'parasite'
  ) %>% 
  ggplot(aes(x = date, y = value)) +
  geom_line(
    aes(
      colour = parasite
    ),
    alpha = 0.25,
    size = 1,
    position = position_dodge(width = 0.8)
  ) +
  scale_color_manual(
    values = c("#00AFBB", "#E7B800")
  ) +
  scale_fill_manual(
    values = c("#00AFBB", "#E7B800")
  ) +
  scale_x_datetime(
    date_labels = '%Y',
    date_breaks = '1 year'
  ) +
  labs(
    y = 'Número de casos reportados de malaria (x1000)', 
    x = NULL
  ) +
  ggtitle(
    label = 'Número de casos mensuales reportados de malaria (x1000) por parásito
    durante los años 2000 a 2017 en Loreto'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

dataset %>% 
  dplyr::group_by(province, date) %>% 
  dplyr::summarise(
    falciparum = sum(falciparum),
    vivax = sum(vivax)
  ) %>% 
  tidyr::pivot_longer(
    cols = c(falciparum, vivax),
    names_to = 'parasite'
  ) %>% 
  ggplot(aes(x = date, y = value)) +
  geom_line(
    aes(
      colour = parasite
    ),
    alpha = 0.25,
    size = 1,
    position = position_dodge(width = 0.8)
  ) +
  scale_color_manual(
    values = c("#00AFBB", "#E7B800")
  ) +
  scale_fill_manual(
    values = c("#00AFBB", "#E7B800")
  ) +
  scale_x_datetime(
    date_labels = '%Y',
    date_breaks = '5 year'
  ) +
  labs(
    y = 'Número de casos reportados de malaria (x1000)', 
    x = NULL
  ) +
  facet_wrap(
    facets = . ~ province,
    scales = 'free'
  ) +
  ggtitle(
    label = 'Número de casos mensuales reportados de malaria (x1000) por parásito
    durante los años 2000 a 2017 por provincias en Loreto'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

dataset %>% 
  dplyr::group_by(district, date) %>% 
  dplyr::summarise(
    falciparum = sum(falciparum),
    vivax = sum(vivax)
  ) %>% 
  tidyr::pivot_longer(
    cols = c(falciparum, vivax),
    names_to = 'parasite'
  ) %>% 
  ggplot(aes(x = date, y = value)) +
  geom_line(
    aes(
      colour = parasite
    ),
    alpha = 0.25,
    size = 1,
    position = position_dodge(width = 0.8)
  ) +
  scale_color_manual(
    values = c("#00AFBB", "#E7B800")
  ) +
  scale_fill_manual(
    values = c("#00AFBB", "#E7B800")
  ) +
  scale_x_datetime(
    date_labels = '%Y',
    date_breaks = '5 year'
  ) +
  labs(
    y = 'Número de casos reportados de malaria (x1000)', 
    x = NULL
  ) +
  facet_wrap(
    facets = . ~ district,
    scales = 'free'
  ) +
  ggtitle(
    label = 'Número de casos mensuales reportados de malaria (x1000) por parásito
    durante los años 2000 a 2017 por distritos en Loreto'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Análisis de la estacionalidad del número de casos reportados de malaria en

Loreto

library(forecast)

dataset %>% 
  dplyr::group_by(date) %>% 
  dplyr::summarise(
    reported_cases = sum(malaria) 
  ) %>% 
  dplyr::select(reported_cases) %>% 
  ts(
    start = 2000,
    frequency = 12
  ) %>% 
  forecast::ggseasonplot(
    polar = TRUE
    ) +
  ggtitle(
    label = 'Polar seasonal plot: \n Número de casos reportados de malaria durante
    los años 2000 a 2017 en Loreto'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

dataset %>% 
  dplyr::group_by(date) %>% 
  dplyr::summarise(
    reported_cases = sum(malaria) 
  ) %>% 
  dplyr::select(reported_cases) %>% 
  ts(
    start = 2000,
    frequency = 12
  ) %>% 
  forecast::ggsubseriesplot(
    polar = TRUE
  ) +
  ggtitle(
    label = 'Seasonal subseries plot: \n Número de casos reportados de malaria durante
    los años 2000 a 2017 en Loreto'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Modelamiento del número de casos reportados de malaria: Caso del distrito de Alto Tapiche

Número de casos mensuales reportados de malaria

dataset %>% 
  dplyr::filter(
    district == 'ALTO TAPICHE'
  ) %>% 
  ggplot(
    aes(
      x = date,
      y = malaria
    )
  ) +
  geom_line() +
  scale_x_datetime(
    date_labels = '%Y',
    date_breaks = '1 year'
  ) +
  labs(
    y = 'Número de casos reportados de malaria', 
    x = NULL
  ) +
  geom_point(
    data = 
      dplyr::filter(
        dataset,
        district == 'ALTO TAPICHE',
        malaria == 0
      ),
    aes(
      x = date,
      y = malaria
    ),
    colour = 'red'
  ) +
  ggtitle(
    label = 'Número de casos mensuales reportados de malaria durante los años 
    2000 a 2017 en el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

dataset %>% 
  dplyr::filter(
    district == 'ALTO TAPICHE'
  ) %>% 
  ggplot(
    aes(x = malaria)
  ) +
  geom_histogram(
    bins = 50,
    color = 'black',
    fill = 'white'
  ) +
  ggtitle(
    label = 'Histograma del número de casos mensuales reportados de malaria 
    durante los años 2000 a 2017 en el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

### Análisis de autocorrelación

dataset %>%
  dplyr::filter(
    district == 'ALTO TAPICHE',
    malaria > 0
  ) %>% 
  dplyr::select(
    malaria
  ) %>% 
  ts(
    start = 2000,
    frequency = 12
  ) %>%
  ggAcf(
    lag.max = 15
  ) +
  ggtitle(
    label = 'Gráfico de autocorrelación del número de casos mensuales reportados 
    de malaria durante los años 2000 a 2017 en el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

dataset %>%
  dplyr::filter(
    district == 'ALTO TAPICHE',
    malaria > 0
  ) %>% 
  dplyr::select(
    malaria
  ) %>% 
  stats::ts(
    start = 2000,
    frequency = 12
  ) %>% 
  forecast::ggPacf(
    lag.max = 15
  ) +
  ggtitle(
    label = 'Gráfico de autocorrelación parcialdel número de casos mensuales 
    reportados de malaria durante los años 2000 a 2017 
    en el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

dataset %>%
  dplyr::filter(
    district == 'ALTO TAPICHE',
    malaria > 0
  ) %>% 
  dplyr::select(
    malaria
  ) %>% 
  stats::ts(
    start = 2000,
    frequency = 12
  ) %>% 
  forecast::gglagplot(
    lag.max = 15
  ) +
  ggtitle(
    label = 'Gráfico de dispersión de lags del número de casos mensuales 
    reportados de malaria durantes los años 2000 a 2017 
    en el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Prueba de Ljung-Box

dataset %>% 
  dplyr::filter(
    district == 'ALTO TAPICHE',
    malaria > 0
  ) %>%
  dplyr::select(
    malaria
  ) %>% 
  stats::ts() %>% 
  stats::Box.test(
    type = 'Ljung-Box'
  )
## 
##  Box-Ljung test
## 
## data:  .
## X-squared = 88.823, df = 1, p-value < 2.2e-16

Análisis de correlación

dataset %>% 
  dplyr::filter(
    district == 'ALTO TAPICHE'
  ) %>% 
  dplyr::select(
    aet,
    prcp,
    soilm,
    tmax,
    tmin,
    malaria
  ) %>% 
  summary()
##       aet              prcp            soilm            tmax      
##  Min.   : 55.97   Min.   : 26.15   Min.   : 52.6   Min.   :30.05  
##  1st Qu.: 73.98   1st Qu.:118.35   1st Qu.:121.2   1st Qu.:31.16  
##  Median : 81.63   Median :179.52   Median :122.0   Median :31.61  
##  Mean   : 82.42   Mean   :182.02   Mean   :115.8   Mean   :31.75  
##  3rd Qu.: 90.96   3rd Qu.:234.09   3rd Qu.:122.0   3rd Qu.:32.35  
##  Max.   :107.03   Max.   :499.92   Max.   :122.0   Max.   :33.99  
##       tmin          malaria      
##  Min.   :18.57   Min.   :  0.00  
##  1st Qu.:20.40   1st Qu.:  2.00  
##  Median :21.00   Median : 11.00  
##  Mean   :20.85   Mean   : 21.81  
##  3rd Qu.:21.40   3rd Qu.: 31.25  
##  Max.   :22.48   Max.   :207.00
dataset %>% 
  dplyr::filter(district == 'ALTO TAPICHE') %>%  
  dplyr::select(
    date,
    aet,
    prcp,
    soilm,
    tmax,
    tmin,
    malaria
  ) %>% 
  tidyr::pivot_longer(
    cols = c(
      aet,
      prcp,
      soilm,
      tmax,
      tmin,
      malaria
    ),
    names_to = 'variable'
  ) %>% 
  ggplot(
    aes(
      x = date,
      y = value
    )
  ) +
  geom_line() +
  scale_x_datetime(
    date_labels = '%Y',
    date_breaks = '1 year'
  ) +
  facet_grid(
    facets = variable ~ .,
    scales = 'free'
  ) + 
  ggtitle(
    label = 'Número de casos reportados y valores de variables climáticas mensuales
    durante los años 2005 a 2017 en el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(
    y = NULL, 
    x = NULL
  )

library(GGally)

dataset %>% 
  dplyr::filter(
    district == 'ALTO TAPICHE',
    malaria > 0
  ) %>%  
  dplyr::select(
    aet,
    prcp,
    soilm,
    tmax,
    tmin,
    malaria
  ) %>% 
  GGally::ggpairs() + 
  ggtitle(
    label = 'Matriz de correlación del número de casos reportados y valores de 
    variables climáticas mensuales durante los años 2005 a 2017 
    el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

dataset %>% 
  dplyr::filter(district == 'ALTO TAPICHE') %>% 
  ggplot(
    aes(
      x = aet, 
      y = malaria
    )
  ) +
  geom_point() +
  geom_smooth(
    method = 'loess'
  ) +
  labs(
    x = 'Evapotranspiración real',
    y = 'Número de casos reportados de malaria'
  ) + 
  ggtitle(
    label = 'Gráfico de dispersión del número de casos reportados de malaria y 
    los valores de evapotranspiración mensuales durante los años 2000 y 2017 
    en el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

dataset %>% 
  dplyr::filter(district == 'ALTO TAPICHE') %>% 
  ggplot(
    aes(
      x = tmax, 
      y = malaria
    )
  ) +
  geom_point() +
  geom_smooth(
    method = 'loess'
  ) +
  labs(
    x = 'Temperatura máxima',
    y = 'Número de casos reportados de malaria'
  ) + 
  ggtitle(
    label = 'Gráfico de dispersión del número de casos reportados de malaria y 
    los valores de temperatura máxima mensuales durante los años 2000 y 2017 
    en el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

library(TTR)
library(tidyquant)

dataset %>% 
  dplyr::filter(
    district == 'ALTO TAPICHE',
    malaria > 0
  ) %>%  
  dplyr::select(
    date,
    malaria,
    aet
  ) %>% 
  tidyquant::tq_mutate_xy(
    x = aet,
    y = malaria,
    mutate_fun = runCor,
    n = 12,
    col_rename = 'roll_corr'
  ) %>% 
  ggplot(
    aes(
      x = date,
      y = roll_corr
    )
  ) +
  geom_line() +
  scale_x_datetime(
    date_labels = '%Y',
    date_breaks = '1 year'
  ) +
  geom_hline(
    aes(
      yintercept = stats::cor(
        x = aet,
        y = malaria
      )
    ),
    colour = 'red'
  ) + 
  ggtitle(
    label = 'Correlación rolling del número de casos reportados de malaria y 
    los valores de evapotranspiración mensuales durante los años 2000 y 2017 
    en el distrito de Alto Tapiche 
    (ventana = 12 meses)'
  ) +
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(
    y = 'Correlación', 
    x = NULL
  )

dataset %>% 
  dplyr::filter(
    district == 'ALTO TAPICHE',
    malaria > 0
  ) %>%  
  dplyr::select(
    date,
    malaria,
    tmax
  ) %>% 
  tidyquant::tq_mutate_xy(
    x = tmax,
    y = malaria,
    mutate_fun = runCor,
    n = 12,
    col_rename = 'roll_corr'
  ) %>% 
  ggplot(
    aes(
      x = date,
      y = roll_corr
    )
  ) +
  geom_line() +
  scale_x_datetime(
    date_labels = '%Y',
    date_breaks = '1 year'
  ) +
  geom_hline(
    aes(
      yintercept = stats::cor(
        x = tmax,
        y = malaria
      )
    ),
    colour = 'red'
  ) + 
  ggtitle(
    label = 'Correlación rolling del número de casos reportados de malaria y 
    los valores de la temperatura máxima mensuales durante los años 2000 y 2017 
    en el distrito de Alto Tapiche 
    (ventana = 12 meses)'
  ) +
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(
    y = 'Correlación', 
    x = NULL
  )

forecast::ggCcf(
  x = ts(
    dplyr::filter(
      dataset,
      malaria > 0,
      district == 'ALTO TAPICHE'
    )$aet
  ),
  y = ts(
    dplyr::filter(
      dataset,
      malaria > 0,
      district == 'ALTO TAPICHE'
    )$malaria
  )
) +
  ggtitle(
    label = 'Gráfico de correlación cruzada del número de casos reportados de malaria y 
    los valores de evapotranspiración mensuales durante los años 2000 y 2017 
    en el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

forecast::ggCcf(
  x = ts(
    dplyr::filter(
      dataset,
      malaria > 0,
      district == 'ALTO TAPICHE'
    )$tmax
  ),
  y = ts(
    dplyr::filter(
      dataset,
      malaria > 0,
      district == 'ALTO TAPICHE'
    )$malaria
  )
) +
  ggtitle(
    label = 'Gráfico de correlación cruzada del número de casos reportados de malaria y 
    los valores de la temperatura máxima mensuales durante los años 2000 y 2017 
    en el distrito de Alto Tapiche'
  ) +
  theme(plot.title = element_text(hjust = 0.5))

#### Matriz de correlación del número de casos reportados de malaria y lags (n = 15) de los valores de evapotranspiración mensuales durante los años 2000 y 2017 en el distrito de Alto Tapiche

library(astsa)

dplyr::filter(
  dataset,
  district == 'ALTO TAPICHE',
  malaria > 0
)$malaria %>% 
  ts() -> malaria
 
dplyr::filter(
  dataset,
  district == 'ALTO TAPICHE',
  malaria > 0
)$aet %>% 
  ts() -> aet

dplyr::filter(
  dataset,
  district == 'ALTO TAPICHE',
  malaria > 0
)$tmax %>% 
  ts() -> tmax

astsa::lag2.plot(
  series1 = aet,
  series2 = malaria,
  max.lag = 15,
) 

#### Matriz de correlación del número de casos reportados de malaria y lags (n = 15) de los valores de la temperatura máxima mensuales durante los años 2000 y 2017 en el distrito de Alto Tapiche

astsa::lag2.plot(
  series1 = tmax,
  series2 = malaria,
  max.lag = 15
)